// GENERATED - DO NOT EDIT
// Copyright 2018+ the Deno authors. All rights reserved. MIT license.
// https://raw.githubusercontent.com/denoland/deno/main/cli/tests/unit/url_search_params_test.ts
import { createDenoTest } from "deno:harness";
const { test, assert, assertEquals } = createDenoTest(import.meta.path);
test(function urlSearchParamsWithMultipleSpaces() {
    const init = {
        str: "this string has spaces in it"
    };
    const searchParams = new URLSearchParams(init).toString();
    assertEquals(searchParams, "str=this+string+has+spaces+in+it");
});
test(function urlSearchParamsWithExclamation() {
    const init = [
        [
            "str",
            "hello, world!"
        ]
    ];
    const searchParams = new URLSearchParams(init).toString();
    assertEquals(searchParams, "str=hello%2C+world%21");
});
test(function urlSearchParamsWithQuotes() {
    const init = [
        [
            "str",
            "'hello world'"
        ]
    ];
    const searchParams = new URLSearchParams(init).toString();
    assertEquals(searchParams, "str=%27hello+world%27");
});
test(function urlSearchParamsWithBraket() {
    const init = [
        [
            "str",
            "(hello world)"
        ]
    ];
    const searchParams = new URLSearchParams(init).toString();
    assertEquals(searchParams, "str=%28hello+world%29");
});
test(function urlSearchParamsWithTilde() {
    const init = [
        [
            "str",
            "hello~world"
        ]
    ];
    const searchParams = new URLSearchParams(init).toString();
    assertEquals(searchParams, "str=hello%7Eworld");
});
test(function urlSearchParamsInitString() {
    const init = "c=4&a=2&b=3&%C3%A1=1";
    const searchParams = new URLSearchParams(init);
    assert(init === searchParams.toString(), "The init query string does not match");
});
test(function urlSearchParamsInitStringWithPlusCharacter() {
    let params = new URLSearchParams("q=a+b");
    assertEquals(params.toString(), "q=a+b");
    assertEquals(params.get("q"), "a b");
    params = new URLSearchParams("q=a+b+c");
    assertEquals(params.toString(), "q=a+b+c");
    assertEquals(params.get("q"), "a b c");
});
test(function urlSearchParamsInitStringWithMalformedParams() {
    let params = new URLSearchParams("id=0&value=%");
    assert(params != null, "constructor returned non-null value.");
    assert(params.has("id"), 'Search params object has name "id"');
    assert(params.has("value"), 'Search params object has name "value"');
    assertEquals(params.get("id"), "0");
    assertEquals(params.get("value"), "%");
    params = new URLSearchParams("b=%2sf%2a");
    assert(params != null, "constructor returned non-null value.");
    assert(params.has("b"), 'Search params object has name "b"');
    assertEquals(params.get("b"), "%2sf*");
    params = new URLSearchParams("b=%2%2af%2a");
    assert(params != null, "constructor returned non-null value.");
    assert(params.has("b"), 'Search params object has name "b"');
    assertEquals(params.get("b"), "%2*f*");
    params = new URLSearchParams("b=%%2a");
    assert(params != null, "constructor returned non-null value.");
    assert(params.has("b"), 'Search params object has name "b"');
    assertEquals(params.get("b"), "%*");
});
test(function urlSearchParamsInitIterable() {
    const init = [
        [
            "a",
            "54"
        ],
        [
            "b",
            "true"
        ]
    ];
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.toString(), "a=54&b=true");
});
test(function urlSearchParamsInitRecord() {
    const init = {
        a: "54",
        b: "true"
    };
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.toString(), "a=54&b=true");
});
test(function urlSearchParamsInit() {
    const params1 = new URLSearchParams("a=b");
    assertEquals(params1.toString(), "a=b");
    const params2 = new URLSearchParams(params1);
    assertEquals(params2.toString(), "a=b");
});
test(function urlSearchParamsAppendSuccess() {
    const searchParams = new URLSearchParams();
    searchParams.append("a", "true");
    assertEquals(searchParams.toString(), "a=true");
});
test(function urlSearchParamsDeleteSuccess() {
    const init = "a=54&b=true";
    const searchParams = new URLSearchParams(init);
    searchParams.delete("b");
    assertEquals(searchParams.toString(), "a=54");
});
test(function urlSearchParamsGetAllSuccess() {
    const init = "a=54&b=true&a=true";
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.getAll("a"), [
        "54",
        "true"
    ]);
    assertEquals(searchParams.getAll("b"), [
        "true"
    ]);
    assertEquals(searchParams.getAll("c"), []);
});
test(function urlSearchParamsGetSuccess() {
    const init = "a=54&b=true&a=true";
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.get("a"), "54");
    assertEquals(searchParams.get("b"), "true");
    assertEquals(searchParams.get("c"), null);
});
test(function urlSearchParamsHasSuccess() {
    const init = "a=54&b=true&a=true";
    const searchParams = new URLSearchParams(init);
    assert(searchParams.has("a"));
    assert(searchParams.has("b"));
    assert(!searchParams.has("c"));
});
test(function urlSearchParamsSetReplaceFirstAndRemoveOthers() {
    const init = "a=54&b=true&a=true";
    const searchParams = new URLSearchParams(init);
    searchParams.set("a", "false");
    assertEquals(searchParams.toString(), "a=false&b=true");
});
test(function urlSearchParamsSetAppendNew() {
    const init = "a=54&b=true&a=true";
    const searchParams = new URLSearchParams(init);
    searchParams.set("c", "foo");
    assertEquals(searchParams.toString(), "a=54&b=true&a=true&c=foo");
});
test(function urlSearchParamsSortSuccess() {
    const init = "c=4&a=2&b=3&a=1";
    const searchParams = new URLSearchParams(init);
    searchParams.sort();
    assertEquals(searchParams.toString(), "a=2&a=1&b=3&c=4");
});
test(function urlSearchParamsForEachSuccess() {
    const init = [
        [
            "a",
            "54"
        ],
        [
            "b",
            "true"
        ]
    ];
    const searchParams = new URLSearchParams(init);
    let callNum = 0;
    searchParams.forEach((value, key, parent)=>{
        assertEquals(searchParams, parent);
        assertEquals(value, init[callNum][1]);
        assertEquals(key, init[callNum][0]);
        callNum++;
    });
    assertEquals(callNum, init.length);
});
test(function urlSearchParamsMissingName() {
    const init = "=4";
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.get(""), "4");
    assertEquals(searchParams.toString(), "=4");
});
test(function urlSearchParamsMissingValue() {
    const init = "4=";
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.get("4"), "");
    assertEquals(searchParams.toString(), "4=");
});
test(function urlSearchParamsMissingEqualSign() {
    const init = "4";
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.get("4"), "");
    assertEquals(searchParams.toString(), "4=");
});
test(function urlSearchParamsMissingPair() {
    const init = "c=4&&a=54&";
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.toString(), "c=4&a=54");
});
test(function urlSearchParamsForShortEncodedChar() {
    const init = {
        linefeed: "\n",
        tab: "\t"
    };
    const searchParams = new URLSearchParams(init);
    assertEquals(searchParams.toString(), "linefeed=%0A&tab=%09");
});
test(function urlSearchParamsShouldThrowTypeError() {
    let hasThrown = 0;
    try {
        new URLSearchParams([
            [
                "1"
            ]
        ]);
        hasThrown = 1;
    } catch (err) {
        if (err instanceof TypeError) {
            hasThrown = 2;
        } else {
            hasThrown = 3;
        }
    }
    assertEquals(hasThrown, 2);
    try {
        new URLSearchParams([
            [
                "1",
                "2",
                "3"
            ]
        ]);
        hasThrown = 1;
    } catch (err) {
        if (err instanceof TypeError) {
            hasThrown = 2;
        } else {
            hasThrown = 3;
        }
    }
    assertEquals(hasThrown, 2);
});
test(function urlSearchParamsAppendArgumentsCheck() {
    const methodRequireOneParam = [
        "delete",
        "getAll",
        "get",
        "has",
        "forEach"
    ];
    const methodRequireTwoParams = [
        "append",
        "set"
    ];
    methodRequireOneParam.concat(methodRequireTwoParams).forEach((method: string)=>{
        const searchParams = new URLSearchParams();
        let hasThrown = 0;
        try {
            (searchParams as any)[method]();
            hasThrown = 1;
        } catch (err) {
            if (err instanceof TypeError) {
                hasThrown = 2;
            } else {
                hasThrown = 3;
            }
        }
        assertEquals(hasThrown, 2);
    });
    methodRequireTwoParams.forEach((method: string)=>{
        const searchParams = new URLSearchParams();
        let hasThrown = 0;
        try {
            (searchParams as any)[method]("foo");
            hasThrown = 1;
        } catch (err) {
            if (err instanceof TypeError) {
                hasThrown = 2;
            } else {
                hasThrown = 3;
            }
        }
        assertEquals(hasThrown, 2);
    });
});
test(function urlSearchParamsDeletingAppendedMultiple() {
    const params = new URLSearchParams();
    params.append("first", (1 as unknown) as string);
    assert(params.has("first"));
    assertEquals(params.get("first"), "1");
    params.delete("first");
    assertEquals(params.has("first"), false);
    params.append("first", (1 as unknown) as string);
    params.append("first", (10 as unknown) as string);
    params.delete("first");
    assertEquals(params.has("first"), false);
});
test(function urlSearchParamsCustomSymbolIterator() {
    const params = new URLSearchParams();
    params[Symbol.iterator] = function*(): IterableIterator<[string, string]> {
        yield [
            "a",
            "b"
        ];
    };
    const params1 = new URLSearchParams((params as unknown) as string[][]);
    assertEquals(params1.get("a"), "b");
});
test(function urlSearchParamsCustomSymbolIteratorWithNonStringParams() {
    const params = {};
    (params as any)[Symbol.iterator] = function*(): IterableIterator<[number, number]> {
        yield [
            1,
            2
        ];
    };
    const params1 = new URLSearchParams((params as unknown) as string[][]);
    assertEquals(params1.get("1"), "2");
});
test(function urlSearchParamsOverridingAppendNotChangeConstructorAndSet() {
    let overridedAppendCalled = 0;
    class CustomSearchParams extends URLSearchParams {
        append(name: string, value: string) {
            ++overridedAppendCalled;
            super.append(name, value);
        }
    }
    new CustomSearchParams("foo=bar");
    new CustomSearchParams([
        [
            "foo",
            "bar"
        ]
    ]);
    new CustomSearchParams(new CustomSearchParams({
        foo: "bar"
    }));
    new CustomSearchParams().set("foo", "bar");
    assertEquals(overridedAppendCalled, 0);
});
test(function urlSearchParamsOverridingEntriesNotChangeForEach() {
    class CustomSearchParams extends URLSearchParams {
        *entries(): IterableIterator<[string, string]> {
            yield* [];
        }
    }
    let loopCount = 0;
    const params = new CustomSearchParams({
        foo: "bar"
    });
    params.forEach(()=>void ++loopCount);
    assertEquals(loopCount, 1);
});
